#include "fliter.h"

/*
* 	限幅滤波算法
* 	输入新数据
*	消除缓变信号中的尖脉冲干扰；适用范围：变化比较缓慢的被测量值
*/
#define LIMIT 20	//最大差值

unsigned char AmplitudeLimiterFliter(unsigned char newvalue)
{
	static unsigned char oldvalue = 0;	
	if(newvalue - oldvalue < LIMIT && oldvalue - newvalue < LIMIT)
	{
		oldvalue = newvalue;
	}
	return oldvalue;
}

/*
* 	中位值滤波算法 
*	对温度、液位等变化缓慢的被测参数有良好的滤波效果
*	输入数组
*/

#define NUM_MID 19
unsigned char MiddlevalueFliter(unsigned char *value)
{
	
	int i,j;
	unsigned char temp=0;
	for(i = 0;i<NUM_MID-1;i++)
	{
		for(j = 0;j < NUM_MID - i -1;j++)
		{
			if(value[j] > value[j+1])
			{
				temp = value[j];
				value[j] = value[j+1];
				value[j+1] = temp;
			}
		}
	}
	return value[(NUM_MID-1)/2];
	
}

/*
* 	算术平均滤波算法 
*	用于对一般具有随机干扰的信号进行滤波
*	输入数组
*/
#define NUM_AVER 20
unsigned char AverageFliter(unsigned char *value)
{
	int i,sum=0;
	for(i = 0;i < NUM_AVER-1; i++)
	{
		sum+=value[i];
	}
	return sum/NUM_AVER;
}

/*
* 	递推平均滤波算法 
*	对周期性干扰有良好的抑制作用，平滑度高；适用于高频振荡的系统
*	输入数组
*/

#define NUM_REC 5
unsigned char RecurrenceAverFliter(unsigned char newvalue)
{
	static unsigned char values[NUM_REC] = {0};
	int i,sum = 0;
	//新来的数据入队尾 队首的数据丢弃
	for(i = 0;i<NUM_REC-1;i++)
	{
		values[i] = values[i+1];
		sum += values[i];
	}
	values[i] = newvalue;
	sum += values[i];
	if(values[0] == 0)
	{
		return 0;
	}
	else
	return sum/NUM_REC;
	
}


/*
* 	中位值平均滤波算法 
*	融合了两种滤波的优点。对于偶然出现的脉冲性干扰，可消
*   除有其引起的采样值偏差。对周期干扰有良好的抑制作用，
*   适于高频振荡的系统。
*	缺点：测量速度慢
*/

#define NUM_MID_AVER 20
unsigned char MidAverFliter(unsigned char *values)
{
	int i,j,temp=0,sum=0;
	for(i = 0;i<NUM_MID_AVER-1;i++)
	{
		for(j = 0;j<NUM_MID_AVER-i-1;j++)
		{
			if(values[j]>values[j+1])
			{
				temp = values[j];
				values[j] = values[j+1];
				values[j+1] = temp;
			}
		}

	}
	for(i=1;i<NUM_MID_AVER-2;i++)
	{
		sum += values[i];
	}
	return sum/(NUM_MID_AVER-2);
	
}